第四章 表达式

Huan Lee Lv5

关键

  • 运算优先级
  • 运算对象转换
  • 重载运算符

左值与右值

  • 左值本质上是对象在内存中的位置
  • 右值则是使用对象的内容,即内存中的数据
  • 取地址符作用于左值,结果为右值
  • 解地址符,下标运算,迭代器解引用,作用于右值,结果为左值

Untitled

算术运算

  • 除法:C++11中规定商一律向0取整(即直接切除小数部分)
  • 取余,结果符号始终于被除数相同

Untitled

逻辑和关系运算符

  • 与和或的计算方式,这个策略在判断下标和解地址时可以有效防止非法操作(越界)

Untitled

  • 比较运算时,右对象会先被转换为和左对象同一个类型

赋值运算符

  • 赋值运算的结果是一个对象(左值)

    • 赋值运算满足右结合律

    Untitled

    • 因此可以用在条件判断中,但切记要区分赋值和相等比较运算符

      • 下面的例子中,由于赋值运算的优先级很低,因此要加上括号

    Untitled

递增和递减运算符

  • 存在前置版本和后置版本

    • 前置版本会将运算对象+1(-1),再将改变后的对象作为求值结果,返回结果为左值

    • 后置版本同样会将运算对象+1(-1),但是求值结果为对象改变前的副本!即返回结果为右值

    • 应该优先使用前置版本,避免将原始值存储下来

  • 递增和递减的运算优先级大于解地址符,所以pbeg++等价于(pbeg++)

Untitled

  • 但是要避免赋值语句(相同对象)和递增符号的混合使用,他们的运算顺序不确定

Untitled

成员访问运算符

  • ptr→mem 等价于 *(ptr).mem

    • 解引用运算符的优先级小于点运算符

条件运算符

  • 可以嵌套且是右结合的,但是尽量不要嵌套太多,否则代码的可读性会很差

位运算符

Untitled

  • 位运算通常会把小整型(如short,char)转换为大整型(如int)
  • 移位运算的优先级比算术运算低,但比关系,赋值,条件运算高,建议使用()

sizeof 运算符

  • 有两种

Untitled

  • 对数组进行sizeof的运算,结果为所有元素的大小之和
  • 对vector和string的sizeof运算,结果为固定的大小,而不包含其中包含的元素空间

逗号运算符

  • 逗号居然是一个运算符?!
  • 会把左侧的运算结果丢弃,右侧的表达式才是真正的结果

(隐式)类型转换

  • 何时发生

Untitled

  • 算术转换

Untitled

Untitled

显式类型转换

  • 命名的强制类型转换:

Untitled

Untitled

  • cast-name包含static_cast, const_cast, dynamic_cast, reinterpret_cast

    • static_cast:只要不包含底层const,则可以使用,在大类型转小类型时有用

    • const_cast用于删除常量的底层const,但依旧不能修改值的操作(为定义)

    • reinterpret_cast是对运算对象进行了位层面的重新解释,十分危险

  • Title: 第四章 表达式
  • Author: Huan Lee
  • Created at : 2023-08-20 13:04:45
  • Updated at : 2024-02-26 04:53:15
  • Link: https://www.mirthfullee.com/2023/08/20/notion-第四章 表达式-88c73ea9/
  • License: This work is licensed under CC BY-NC-SA 4.0.